package com.fengkai.filepost.pdfoutstream.test.ODsolutions;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Fengkai
 * @creat 2023/4/14
 * 为了提升数据传输的效率，会对传输的报文进行压缩处理。
 * 输入一个压缩后的报文，请返回它解压后的原始报文。
 * 压缩规则：n[str]，表示方括号内部的 str 正好重复 n 次。
 * 注意 n 为正整数（0 < n <= 100），str只包含小写英文字母，不考虑异常情况。
 * 注：
 * 1）原始报文长度不会超过1000，不考虑异常的情况
 * 输入
 * 输入压缩后的报文：
 * 1）不考虑无效的输入，报文没有额外的空格，方括号总是符合格式要求的；
 * 2）原始报文不包含数字，所有的数字只表示重复的次数 n ，例如不会出现像5b或3[8]的输入；
 * 输出
 * 解压后的原始报文
 */
public class CharExpersion {
    public static void main(String[] args) {
        Pattern compile = Pattern.compile("[0-9]+\\[([^\\[\\]]*)\\]");
        Matcher matcher = compile.matcher("3[m2[c3[h]]]6[a]");

        System.out.println(compress("3[m2[c]]"));
    }

    public static String compress(String str) {
        Pattern compile = Pattern.compile("[0-9]+\\[([^\\[\\]]*)\\]");

        out:while (true){
            StringBuffer stringBuilder = new StringBuffer();
            Matcher matcher = compile.matcher(str);
            boolean match = false;
            while (matcher.find()){
                match = true;
                String group = matcher.group();
                int count = Integer.parseInt(group.substring(0, group.indexOf("[")));
                String in = group.substring(group.indexOf("[") + 1, group.indexOf("]"));
                StringBuilder stringBuilder1 = new StringBuilder();
                for (int i = 0; i < count; i++) {
                    stringBuilder1.append(in);
                }
                matcher.appendReplacement(stringBuilder, matcher.group().replace(group, stringBuilder1.toString()));
            }
            matcher.appendTail(stringBuilder);
            str = stringBuilder.toString();
            if (!match){
                break;
            }
        }
        return str;
    }
}
